#include "./include/getsym.h"

using namespace std;

node getnode(string s) {

  //判断s的类型是否是关键字
  for(int i=0;i<28;i++) {
    if(s.compare(keyword_table[i])==0) {
      return node(type_table[i]);
    }
  }

  int len = s.length();
  //判断是否是数字
  int num = 0;
  for(int i=0;i<len;i++) {
    if(s[i]>='0'&&s[i]<='9') {
      num = num*10 + (s[i]-'0');
    } else {
      num = -1;
    }
  }
  if(num!=-1)
    return node(num);

  //判断是否是合法的标识符
  if(s[0]>='a'&&s[0]<='z') {
    for(int i=1;i<len;i++) {
      if(s[i]>'9'&&s[i]<'0'&&s[i]>'z'&&s[i]<'a') {
        printf("%s不合法\n",s.c_str());
        return node(SYM_NULL);
      }
    }
  }
  return node(s);
}

void handle(queue<node> * q,string s) {
  s += ' ';
  int left=-1,right=-1;
  int len = s.length();

  for(int i=0;i<len;i++) {
    if(s[i]!=' '&&s[i]!='\t') {
      left = left==-1? i:left;
      right = right==-1? i:right+1;
    } else if(left!=-1&&right!=-1){
      if(s[right]==','||s[right]==';'||s[right]=='.') {
        if(right!=left) {
          q->push(getnode(s.substr(left,right-left)));
        }
        q->push(getnode(s.substr(right, 1)));
      } else {
        q->push(getnode(s.substr(left,right-left+1)));
      }
      left=right=-1;
    }
  }
}

analyzer::analyzer(string filename) {
  code.open(filename.c_str());
  if(!code.is_open()) {
    cout<<"打开文件失败"<<endl;
  }
}
node analyzer::get_a_node() {
  string s;
  //如果缓存区为空，先填充缓存区
  while (node_queue.empty()) {
    if(getline(code, s)) {
      handle(&node_queue, s);
    } else {
      code.close();
      return node(SYM_OVER);
    }
  }
  //返回缓存队列的第一个元素
  node n = node_queue.front();
  node_queue.pop();
  return n;
}
